package com.zjw.algorithm;

import java.util.Arrays;

/**
 * 在给定单词列表 wordlist 的情况下，我们希望实现一个拼写检查器，将查询单词转换为正确的单词。
 * <p>
 * 对于给定的查询单词 query，拼写检查器将会处理两类拼写错误：
 * <p>
 * 大小写：如果查询匹配单词列表中的某个单词（不区分大小写），则返回的正确单词与单词列表中的大小写相同。
 * 例如：wordlist = ["yellow"], query = "YellOw": correct = "yellow"
 * 例如：wordlist = ["Yellow"], query = "yellow": correct = "Yellow"
 * 例如：wordlist = ["yellow"], query = "yellow": correct = "yellow"
 * 元音错误：如果在将查询单词中的元音 ('a', 'e', 'i', 'o', 'u')  分别替换为任何元音后，能与单词列表中的单词匹配（不区分大小写），则返回的正确单词与单词列表中的匹配项大小写相同。
 * 例如：wordlist = ["YellOw"], query = "yollow": correct = "YellOw"
 * 例如：wordlist = ["YellOw"], query = "yeellow": correct = "" （无匹配项）
 * 例如：wordlist = ["YellOw"], query = "yllw": correct = "" （无匹配项）
 * 此外，拼写检查器还按照以下优先级规则操作：
 * <p>
 * 当查询完全匹配单词列表中的某个单词（区分大小写）时，应返回相同的单词。
 * 当查询匹配到大小写问题的单词时，您应该返回单词列表中的第一个这样的匹配项。
 * 当查询匹配到元音错误的单词时，您应该返回单词列表中的第一个这样的匹配项。
 * 如果该查询在单词列表中没有匹配项，则应返回空字符串。
 * 给出一些查询 queries，返回一个单词列表 answer，其中 answer[i] 是由查询 query = queries[i] 得到的正确单词。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：wordlist = ["KiTe","kite","hare","Hare"], queries = ["kite","Kite","KiTe","Hare","HARE","Hear","hear","keti","keet","keto"]
 * 输出：["kite","KiTe","KiTe","Hare","hare","","","KiTe","","KiTe"]
 * 示例 2:
 * <p>
 * 输入：wordlist = ["yellow"], queries = ["YellOw"]
 * 输出：["yellow"]
 */
public class Solution16_2 {


    public static void main(String[] args) {
        System.out.println(Arrays.toString(new Solution16_2().spellchecker(new String[]{"KiTe", "kite", "hare", "Hare"}, new String[]{"kite", "Kite", "KiTe", "Hare", "HARE", "Hear", "hear", "keti", "keet", "keto"})));
        System.out.println(Arrays.toString(new Solution16_2().spellchecker(new String[]{"yellow"}, new String[]{"YellOw"})));
    }

    public String[] spellchecker(String[] wordlist, String[] queries) {
        String[] result = new String[queries.length];

        for (int i = 0; i < queries.length; i++) {
            result[i] = searchIn(wordlist, queries[i]);
        }

        return result;
    }

    private String searchIn(String[] wordlist, String query) {
        int maxValue = 0;
        String record = "";
        for (String s : wordlist) {

            int smileValue = calcSimilarityValue(query, s);

            if (smileValue > 0) {
                if (smileValue == 3 * s.length()) {
                    //完全相似
                    return s;
                } else {
                    //匹配到元音或者大小写
                }
            }
        }
        return record;
    }

    /*
     * 计算相似度，0表示无相关，
     * */
    private int calcSimilarityValue(String t1, String t2) {
        if (t1.length() != t2.length()) {
            return 0;
        }

        int p = 0;
        char k1, k2;
        int lowAbs = Math.abs('A' - 'a');
        int count = 0;
        while (p < t1.length()) {
            if ((k1 = t1.charAt(p)) != (k2 = t2.charAt(p))) {
                if (Math.abs(k1 - k2) == lowAbs) {
                    count += 2;
                } else if ((k1 == 'a' || k1 == 'e' || k1 == 'i' || k1 == 'o' || k1 == 'u') && (k2 == 'a' || k2 == 'e' || k2 == 'i' || k2 == 'o' || k2 == 'u')) {
                    count += 1;
                } else {
                    return 0;
                }
            } else {
                count += 3;
            }
            p++;
        }

        return count;
    }
}
